package org.study.itcast.socket;

import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;
import java.util.Set;

import static org.study.ByteBufferUtil.debugAll;

/**
 * @author: jzhou
 * @date: 2024/4/21-21:45
 * @version: 1.0
 * @description: spark3.3-study
 */
@Slf4j
public class ServerSelectorDemo {
    public static void main(String[] args) {
        try (ServerSocketChannel ssc = ServerSocketChannel.open()) {
            ssc.bind(new InetSocketAddress(8080));
            log.debug(ssc.toString());
            // 1. 建立selector 管理多个channel
            Selector selector = Selector.open();
            ssc.configureBlocking(false);
            // 2. 将channel 注册到selector，建立二者的联系
            SelectionKey register = ssc.register(selector, SelectionKey.OP_ACCEPT, null);
            log.debug("key {}", register);  // 多个线程 建立多个channel 但 SelectionKey 是同一个
            while (true) {
                // 3. select 方法 没有事件发生 线程阻塞，有事件发生 线程唤醒恢复运行
                // 有未处理事件时是不会阻塞的
                int count = selector.select();

                log.debug("select count: {}", count);

                // 获取所有事件
                Set<SelectionKey> keys = selector.selectedKeys();
                log.debug("key {}", register);  // 多个线程 建立多个channel 但 SelectionKey 是同一个
                log.info("keys size {}" , keys.size());
                // 4. 处理事件 SelectionKey 包含所有事件， 遍历所有事件，逐一处理
                Iterator<SelectionKey> iter = keys.iterator();

                while (iter.hasNext()) {
                    SelectionKey key = iter.next();
                    log.debug("key {}", key);
//                    key.cancel();

                }
            }
        } catch (IOException e) {
            log.error("know" + e);
        }
    }
}